home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / dld-3_23.lha / dld-3.2.3 / test / general / read-a.out.c < prev    next >
C/C++ Source or Header  |  1991-05-30  |  3KB  |  95 lines

  1. #include <stdio.h>
  2. #include <a.out.h>
  3.  
  4. #if defined(sun) && defined(sparc)
  5. #define relocation_info reloc_info_sparc
  6. #endif
  7.     
  8. read_a_out (argc, argv)
  9. int argc;
  10. char **argv;
  11. {
  12.     struct exec header;
  13.     struct relocation_info relo;
  14.     struct nlist name_list;
  15.     FILE *objfile;
  16.     char *string;
  17.     int str_size;
  18.     int i;
  19.  
  20.     if (argc < 1) exit ();
  21.  
  22.     if ((objfile = fopen (argv[1], "r")) == NULL) {
  23.     perror ("Can't open object file");
  24.     exit ();
  25.     }
  26.  
  27.     if (!fread (&header, sizeof(header), 1, objfile)) {
  28.     perror ("Can't read header");
  29.     exit ();
  30.     }
  31.  
  32.     printf ("Header information:\nmagic = 0%o, text size = %d, data size = %d\n",
  33.         header.a_magic, header.a_text, header.a_data);
  34.     printf ("bss size = %d, syms size = %d, entry point = 0x%x, trsize = %d, drsize = %d\n",
  35.         header.a_bss, header.a_syms, header.a_entry, header.a_trsize,
  36.         header.a_drsize);
  37.  
  38.     
  39.     fseek (objfile, header.a_text + header.a_data + header.a_bss, 1);
  40.     if (header.a_trsize != 0) {
  41.     printf ("\n\nText relocation info\n");
  42.     for (i=0; i<(header.a_trsize/sizeof(relo)); i++) {
  43.         fread (&relo, sizeof(relo), 1, objfile);
  44.  
  45. #if defined(sun) && defined(sparc)
  46.         printf ("Address = 0x%x, local offset = %d\n",
  47.             relo.r_address, relo.r_index);
  48.         printf ("extern = %d, relocation type = %d, addend = %d\n",
  49.             relo.r_extern, relo.r_type, relo.r_addend);
  50. #else
  51.         
  52.         printf ("Address = 0x%x, local offset = %d\n",
  53.             relo.r_address, relo.r_symbolnum);
  54.         printf ("pc relocated = %d, length = %d, extern = %d\n",
  55.             relo.r_pcrel, relo.r_length, relo.r_extern);
  56. #endif        
  57.     }
  58.     }
  59.  
  60.     if (header.a_drsize != 0) {
  61.     printf ("\n\nData relocation info\n");
  62.     for (i=0; i<(header.a_trsize/sizeof(relo)); i++) {
  63.         fread (&relo, sizeof(relo), 1, objfile);
  64.  
  65. #if defined(sun) && defined(sparc)
  66.         printf ("Address = 0x%x, local offset = %d\n",
  67.             relo.r_address, relo.r_index);
  68.         printf ("extern = %d, relocation type = %d, addend = %d\n",
  69.             relo.r_extern, relo.r_type, relo.r_addend);
  70. #else
  71.         
  72.         printf ("Address = 0x%x, local offset = %d\n",
  73.             relo.r_address, relo.r_symbolnum);
  74.         printf ("pc relocated = %d, length = %d, extern = %d\n",
  75.             relo.r_pcrel, relo.r_length, relo.r_extern);
  76. #endif        
  77.     }
  78.     }
  79.  
  80.     fseek (objfile, N_STROFF(header), 0);
  81.     fread (&str_size, sizeof(str_size), 1, objfile);
  82.     string = (char *) malloc (str_size);
  83.     fseek (objfile, N_STROFF(header), 0);
  84.     fread (string, 1, str_size, objfile);
  85.  
  86.     fseek (objfile, N_SYMOFF(header), 0);
  87.  
  88.     printf ("\n\n");
  89.     for (i=0; i<(header.a_syms/sizeof(struct nlist)); i++) {
  90.     fread (&name_list, sizeof (struct nlist), 1, objfile);
  91.     printf ("string = %s\n", string + name_list.n_un.n_strx);
  92.     printf ("Type = 0x%x, value = 0x%08x\n", name_list.n_type, (int)name_list.n_value);
  93.     }
  94.